/**
 * @file interfacefifo.c
 * @brief Short description of this file.
 *
 * Complete description of this file.
 *
 * @date Mar 10, 2012
 * @author Francesco Corvino
 */
#include "interfacefifo.h"

/**
 * @brief Prova a creare una fifo secondo il nome passato.
 *
 * @param name percorso dove creare la fifo.
 * @return 1 se è stata effettuata la creazione della fifo, 0 se era già presente, -1 se il processo è fallito.
 */
int InterfaceFifo_createFifo(char * name){
    if (access(name, F_OK) == -1) {
        int res = mkfifo(name, 0777);
        if (res != 0) return -1;
        else return 1;
    } else return 0;
}

void InterfaceFifo_startComm(InterfaceFifo * fifo){
    fifo->pipefd = open(fifo->name, fifo->openmode);
    // set status of pipe
    if (fifo->pipefd != -1) fifo->status = 1;
    else fifo->status = -1;
}

int InterfaceFifo_sendMsg(InterfaceFifo * fifo, char*msg){
	int bytetosend = strlen(msg);
	int res, bytes_sent = 0;
	if(fifo->status==-1) InterfaceFifo_startComm(fifo);
    while(bytes_sent < bytetosend) {
        res = write(fifo->pipefd, msg, bytetosend);
        if (res == -1) return -1;
        bytes_sent += res;
    }
    return bytes_sent;
}

int InterfaceFifo_rcvMsg(InterfaceFifo * fifo, char* buffer, size_t lengbuff){
	int res = read(fifo->pipefd, buffer, lengbuff);
    return res;
}

void InterfaceFifo_closeComm(InterfaceFifo * fifo){
    if(fifo->status) close(fifo->pipefd);
}
